home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / STRAYLIGHT / CORE.ZIP / StraySrc / Utilities / c / headerGen < prev    next >
Text File  |  1998-01-18  |  5KB  |  218 lines

  1. /*
  2.  * headerGen.c
  3.  *
  4.  * Generate Sapphire headers automatically
  5.  *
  6.  * © 1994-1998 Straylight
  7.  */
  8.  
  9. /*----- Licensing note ----------------------------------------------------*
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2, or (at your option)
  14.  * any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program.  If not, write to the Free Software Foundation,
  23.  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  */
  25.  
  26. #include <stdlib.h>
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <ctype.h>
  30.  
  31. #include "kernel.h"
  32. #include "swis.h"
  33.  
  34. static void swi(int s,_kernel_swi_regs *r)
  35. {
  36.   _kernel_oserror *e=_kernel_swi(s,r,r);
  37.   if (e)
  38.   {
  39.     fprintf(stderr,"Arrghh -- %s\n",e->errmess);
  40.     exit(1);
  41.   }
  42. }
  43.  
  44. static char *getline(char **p,char *b)
  45. {
  46.   while (**p!=10)
  47.     *b++=*((*p)++);
  48.   *b=0;
  49.   (*p)++;
  50.   return (b);
  51. }
  52.  
  53. static void headergen(char *buff,char *infile,char *outfile)
  54. {
  55.   FILE *fp;
  56.   char b[256];
  57.   char *p;
  58.   char *leaf=strrchr(infile,'.');
  59.  
  60.   if (!leaf)
  61.     leaf=outfile;
  62.   else
  63.     leaf++;
  64.  
  65.   if (fp=fopen(outfile,"w"),!fp)
  66.   {
  67.     fprintf(stderr,"Couldn't open output\n");
  68.     exit(1);
  69.   }
  70.  
  71.   /* --- Do the header (this bit's a little fragile) --- */
  72.  
  73.   getline(&buff,b);
  74.   fprintf(fp,"%s\n",b);
  75.  
  76.   getline(&buff,b);
  77.   fprintf(fp,"%sh\n",b);
  78.  
  79.   getline(&buff,b);
  80.   fprintf(fp,"%s\n",b);
  81.  
  82.   p=getline(&buff,b);
  83.   if (p[-1]==')' && p[-5]=='(')
  84.     p[-6]=0;
  85.   fprintf(fp,"%s\n",b);
  86.  
  87.   getline(&buff,b);
  88.   fprintf(fp,"%s\n",b);
  89.  
  90.   getline(&buff,b);
  91.   fprintf(fp,"%s\n",b);
  92.  
  93.   getline(&buff,b);
  94.   fprintf(fp,"%s\n",b);
  95.  
  96.   getline(&buff,b);
  97.   fprintf(fp,"%s\n",b);
  98.  
  99.   fprintf(fp,";----- Licensing note -------------------------------------------------------\n"
  100.              ";\n"
  101.              "; This file is part of Straylight's Sapphire library.\n"
  102.              ";\n"
  103.              "; Sapphire is free software; you can redistribute it and/or modify\n"
  104.              "; it under the terms of the GNU General Public License as published by\n"
  105.              "; the Free Software Foundation; either version 2, or (at your option)\n"
  106.              "; any later version.\n"
  107.              ";\n"
  108.              "; Sapphire is distributed in the hope that it will be useful,\n"
  109.              "; but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
  110.              "; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
  111.              "; GNU General Public License for more details.\n"
  112.              ";\n"
  113.              "; You should have received a copy of the GNU General Public License\n"
  114.              "; along with Sapphire.  If not, write to the Free Software Foundation,\n"
  115.              "; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"
  116.              "\n"
  117.              ";----- Overview -------------------------------------------------------------\n"
  118.              ";\n"
  119.              "; Functions provided:\n"
  120.              ";\n");
  121.  
  122.   /* --- Search for all EXPORTs and output them in the overview --- */
  123.  
  124.   {
  125.     char *bb=buff;
  126.     do
  127.     {
  128.       getline(&bb,b);
  129.       if (!memcmp(b,"\t\tEXPORT",8))
  130.       {
  131.         p=b+8;
  132.         while (!isalnum(*p) && !(*p=='_'))
  133.           p++;
  134.         fprintf(fp,";  ");
  135.         while (isalnum(*p) || *p=='_')
  136.           fputc(*p++,fp);
  137.         fputc('\n',fp);
  138.       }
  139.     }
  140.     while (memcmp(b,"\t\tEND",5));
  141.   }
  142.   fputc('\n',fp);
  143.  
  144.   fprintf(fp,"\t\t[\t:LNOT::DEF:%s__dfn\n"
  145.              "\t\tGBLL\t%s__dfn\n"
  146.              "\n",
  147.              leaf,leaf);
  148.  
  149.   /* --- Now output the block comments etc. --- */
  150.  
  151.   {
  152.     char *bb=buff;
  153.     char *ob=bb;
  154.     char *cm=0;
  155.     char *ocm=(char *)0x80000000;
  156.     do
  157.     {
  158.       getline(&bb,b);
  159.       if (*b==';' && !cm)
  160.       {
  161.         cm=ob;
  162.       }
  163.       else if (*b!=';' && cm)
  164.       {
  165.         ocm=cm;
  166.         cm=0;
  167.       }
  168.       if (!memcmp(b,"\t\tEXPORT",8))
  169.       {
  170.         for (p=ocm;p<ob;p++)
  171.           fputc(*p,fp);
  172.         fprintf(fp,"\t\tIMPORT\t%s\n\n",b+9);
  173.       }
  174.       ob=bb;
  175.     }
  176.     while (memcmp(b,"\t\tEND",5));
  177.   }
  178.  
  179.   fprintf(fp,"\t\t]\n"
  180.              "\n"
  181.              ";----- That's all, folks ----------------------------------------------------\n"
  182.              "\n"
  183.              "\t\tEND\n");
  184.  
  185.   fclose(fp);
  186. }
  187.  
  188. int main(int argc,char *argv[])
  189. {
  190.   if (argc!=3)
  191.   {
  192.     fprintf(stderr,"Syntax: headerGen <input> <output>\n");
  193.     exit(1);
  194.   }
  195.  
  196.   /* --- Load input file into mondo buffer --- */
  197.  
  198.   {
  199.     _kernel_swi_regs r;
  200.     char *fb;
  201.     r.r[0]=17;
  202.     r.r[1]=(int)argv[1];
  203.     swi(OS_File,&r);
  204.     if (fb=malloc(r.r[4]),!fb)
  205.     {
  206.       fprintf(stderr,"No memory -- buy some more\n");
  207.       exit(1);
  208.     }
  209.     r.r[0]=16;
  210.     r.r[1]=(int)argv[1];
  211.     r.r[2]=(int)fb;
  212.     r.r[3]=0;
  213.     swi(OS_File,&r);
  214.     headergen(fb,argv[1],argv[2]);
  215.   }
  216.   return (0);
  217. }
  218.